// ----------------------------------
// RSDK Project: Sonic Essence
// Script Description: HUD Object
// Script Author: Christian Whitehead/Simon Thomley
// Edits by Team ReDream (Xanman)
// ----------------------------------

// Aliases
private alias 5 : TYPE_HUD

private alias object.value0 : HUD.drawFunction
private alias object.value1 : HUD.flashingTimer
private alias object.value2 : HUD.flyoff

private alias object.value3 : best.seconds
private alias object.value4 : best.minutes
private alias object.value5 : best.milliseconds

private alias object.xpos 	: player.xpos
private alias object.ypos 	: player.ypos
private alias object.value0 : player.rings
private alias object.value7 : hud.timer
private alias object.value8 : bosshealthrise.complete

// Function declarations
reserve function HUD_DrawPC
reserve function HUD_DrawMobile
reserve function HUD_DrawTA

private value redRing_1 = 0
private value redRing_2 = 0
private value redRing_3 = 0
private value redRing_4 = 0
private value redRing_5 = 0

private value checkRedRingCount = 0

private value testmode = 0


function HUD_DrawPC
	object.inkEffect = INK_ALPHA
	object.alpha = 255

	CheckEqual(object[30].type, TypeName[Act Finish])
	if checkResult == 1
		if HUD.flyoff < screen.xsize
			HUD.flyoff -= 15
		end if
	else
		CheckEqual(object[0].type, TypeName[Death Event])
		if checkResult == 1
			if HUD.flyoff < screen.xsize
				HUD.flyoff -= 15
			end if
		else
			if HUD.hidden == 0
				if HUD.flyoff < 0
					HUD.flyoff += 15
				endif
		//	else
		//		if HUD.flyoff < screen.xsize
		//			HUD.flyoff -= 10
		//		endif
			endif
		end if
	end if
	temp0 = HUD.flyoff

	temp0 += 45

	DrawSpriteScreenXY(14, temp0, 0)
	
	temp0 -= 45
	DrawSpriteScreenXY(10, temp0, 0)
	temp0 += 33
	DrawSpriteScreenXY(13, temp0, 43)
	temp0 += 3

	if player[0].rings == 0
		if HUD.flashingTimer > 7
			DrawSpriteScreenXY(12, temp0, 46)
		end if
	end if
	temp0 += 55
	DrawNumbers(24, temp0, 10, player.score, 6, 7, 1)
	temp0 -= 7
	if player.score < 10
		DrawSpriteScreenXY(52, temp0, 10)
	end if
	temp0 -= 7
	if player.score < 100
		DrawSpriteScreenXY(52, temp0, 10)
	end if
	temp0 -= 7
	if player.score < 1000
		DrawSpriteScreenXY(52, temp0, 10)
	end if
	temp0 -= 7
	if player.score < 10000
		DrawSpriteScreenXY(52, temp0, 10)
	end if
	temp0 -= 7
	if player.score < 100000
		DrawSpriteScreenXY(52, temp0, 10)
	end if

	temp0 -= 21
	DrawNumbers(0, temp0, 16, stage.seconds, 2, 10, 1)
	temp0 -= 25
	DrawNumbers(0, temp0, 16, stage.minutes, 2, 10, 1)
	temp0 += 13
	
	DrawNumbers(38, temp0, 35, stage.milliseconds, 2, 7, 1)
	temp0 += 11
	DrawRect(16, temp0, 13, 10, 255, 255, 255, 155)
	temp0 -= 24
	

	temp0 += 69
	DrawNumbers(24, temp0, 54, player[0].rings, 3, 7, 1)
	temp0 -= 7
	if player[0].rings < 10
		DrawSpriteScreenXY(52, temp0, 54)
	end if
	temp0 -= 7
	if player[0].rings < 100
		DrawSpriteScreenXY(52, temp0, 54)
	end if

	temp0 -= 5


		foreach (TypeName[Red Ring], arrayPos1, ALL_ENTITIES)
			object[arrayPos1].priority = PRIORITY_ACTIVE
				temp5 += 1
			if object[arrayPos1].propertyValue == 1
				if object[arrayPos1].value2 == 1
					redRing_1 = 57
				else
					redRing_1 = 56
				endif
			endif
			if object[arrayPos1].propertyValue == 2
				if object[arrayPos1].value2 == 1
					redRing_2 = 57
				else
					redRing_2 = 56
				endif
			endif
			if object[arrayPos1].propertyValue == 3
				if object[arrayPos1].value2 == 1
					redRing_3 = 57
				else
					redRing_3 = 56
				endif
			endif
			if object[arrayPos1].propertyValue == 4
				if object[arrayPos1].value2 == 1
					redRing_4 = 57
				else
					redRing_4 = 56
				endif
			endif
			if object[arrayPos1].propertyValue == 5
				if object[arrayPos1].value2 == 1
					redRing_5 = 57
				else
					redRing_5 = 56
				endif
			endif
		next
	checkRedRingCount = temp5
	if checkRedRingCount != 0
		if redRing_1 != 0
			DrawSpriteScreenFX(redRing_1, FX_INK, temp0, 24)
		endif

		temp0 += 17
		if redRing_2 != 0
			DrawSpriteScreenFX(redRing_2, FX_INK, temp0, 24)
		endif

		temp0 += 17
		if redRing_3 != 0
			DrawSpriteScreenFX(redRing_3, FX_INK, temp0, 24)
		endif

		temp0 += 17
		if redRing_4 != 0
			DrawSpriteScreenFX(redRing_4, FX_INK, temp0, 24)
		endif

		temp0 += 17
		if redRing_5 != 0
			DrawSpriteScreenFX(redRing_5, FX_INK, temp0, 24)
		endif
		
	endif

	temp0 -= 30

	//DrawSpriteScreenXY(54, 3, 198)
		
	if options.expertmode == 1
		temp0 -= 60
		DrawSpriteScreenXY(58, temp0, 200)
		temp0 += 49
		DrawNumbers(24, temp0, 211, player.lives, 3, 7, 1)
		temp0 -= 7
		if player.lives < 10
			DrawSpriteScreenXY(52, temp0, 211)
		end if
		temp0 -= 7
		if player.lives < 100
			DrawSpriteScreenXY(52, temp0, 211)
		end if
	end if

	if stage.debugMode == true
		DrawSpriteScreenXY(53, 0, screen.ysize)
		// XPos display
		temp0 = player[0].xpos
		temp0 >>= 16
		Abs(temp0)
		temp1 = screen.xsize
		temp1 -= 24
		DrawNumbers(24, temp1, 13, temp0, 5, 7, 1)

		// YPos display
		temp0 = player[0].ypos
		temp0 >>= 16
		Abs(temp0)
		DrawNumbers(24, temp1, 29, temp0, 5, 7, 1)
	end if

	if testmode == 1
		// Player position display, show it if they have debug mode on

		// XPos display
		temp0 = player[0].xpos
		temp0 >>= 16
		Abs(temp0)
		temp1 = screen.xsize
		temp1 -= 24
		DrawNumbers(24, temp1, 13, temp0, 5, 7, 1)

		// YPos display
		temp0 = player[0].ypos
		temp0 >>= 16
		Abs(temp0)
		DrawNumbers(24, temp1, 29, temp0, 5, 7, 1)
		DrawNumbers(24, temp1, 45, object[currentPlayer].controlMode, 3, 7, 1)
		DrawNumbers(24, temp1, 61, object[0].value43, 3, 7, 1)

		temp1 -= 64

		DrawNumbers(24, 30, 220, tileLayer[0].xsize, 3, 7, 1)			//Stage Size X
		DrawNumbers(24, 60, 220, tileLayer[0].ysize, 3, 7, 1)			//Stage Size Y
		DrawNumbers(24, temp1, 45, HUD.hidden, 1, 7, 1) 				//will remove this later
		DrawNumbers(24, temp1, 61, cutscene.mode, 1, 7, 1) 				//will remove this later
		DrawNumbers(24, temp1, 77, object[21].state, 1, 7, 1) 			//will remove this later 
		DrawNumbers(24, temp1, 93, object[21].type, 3, 7, 1) 			//will remove this later 
	end if
end function

function HUD_DrawTA
	CheckEqual(object[30].type, TypeName[Act Finish])
	if checkResult == 1
		if HUD.flyoff < screen.xsize
			HUD.flyoff -= 10
		end if
	end if
	temp0 = HUD.flyoff
	
	temp0 += 5
	DrawSpriteScreenXY(49, screen.xcenter, temp0)
	temp0 -= 3
	DrawSpriteScreenXY(50, 90, temp0)
	DrawSpriteScreenXY(51, 250, temp0)
	
	temp0 += 3

	if player[0].rings == 0
		if HUD.flashingTimer > 7
			DrawSpriteScreenXY(12, 253, temp0)
		end if
	end if

	temp0 += 8

	switch stage.listpos
		case 0
			temp5 = saveRAM[410]
			break
		case 1
			temp5 = saveRAM[411]
			break
		case 2
			temp5 = saveRAM[412]
			break
	end switch
	temp7 = temp5
	temp7 /= 0x1770
	best.minutes = temp7
	temp7 = temp5
	temp6 = 0x1770
	temp6 *= best.minutes
	temp7 -= temp6
	temp7 /= 100
	best.seconds = temp7
	best.milliseconds = temp5

	DrawNumbers(24, 104, temp0, best.minutes, 2, 7, 1)
	DrawNumbers(24, 122, temp0, best.seconds, 2, 7, 1)
	DrawNumbers(24, 140, temp0, best.milliseconds, 2, 7, 1)

	temp0 -= 1

	DrawNumbers(38, 213, temp0, stage.seconds, 2, 7, 1)
	DrawNumbers(38, 197, temp0, stage.minutes, 2, 7, 1)
	DrawNumbers(38, 229, temp0, stage.milliseconds, 2, 7, 1)

	temp0 += 1

	DrawNumbers(24, 305, temp0, player[0].rings, 3, 7, 1)

	if testmode == 1
		// Player position display, show it if they have debug mode on

		// XPos display
		temp0 = player[0].xpos
		temp0 >>= 16
		Abs(temp0)
		temp1 = screen.xsize
		temp1 -= 24
		DrawNumbers(24, temp1, 13, temp0, 5, 7, 1)

		// YPos display
		temp0 = player[0].ypos
		temp0 >>= 16
		Abs(temp0)
		DrawNumbers(24, temp1, 29, temp0, 5, 7, 1)
		DrawNumbers(24, temp1, 45, object[currentPlayer].controlMode, 3, 7, 1)
		DrawNumbers(24, temp1, 61, object[0].value43, 3, 7, 1)

		temp1 -= 64

		DrawNumbers(24, temp1, 13, tileLayer[0].xsize, 3, 7, 1)			//Stage Size X
		DrawNumbers(24, temp1, 29, tileLayer[0].ysize, 3, 7, 1)			//Stage Size Y
		DrawNumbers(24, temp1, 45, tileLayer[1].parallaxFactor, 8, 7, 1) 	//will remove this later
		DrawNumbers(24, temp1, 61, hParallax[0].scrollPos, 8, 7, 1) 	//will remove this later
	end if

	if stage.debugMode == true
		DrawSpriteScreenXY(53, 0, screen.ysize)
		// XPos display
		temp0 = player[0].xpos
		temp0 >>= 16
		Abs(temp0)
		temp1 = screen.xsize
		temp1 -= 24
		DrawNumbers(24, temp1, 13, temp0, 5, 7, 1)

		// YPos display
		temp0 = player[0].ypos
		temp0 >>= 16
		Abs(temp0)
		DrawNumbers(24, temp1, 29, temp0, 5, 7, 1)
	end if
end function

function HUD_DrawPCBoss

	CheckEqual(object[30].type, TypeName[Act Finish])
	if checkResult == 1
		if HUD.flyoff < screen.xsize
			HUD.flyoff -= 15
		end if
	else
		CheckEqual(object[0].type, TypeName[Death Event])
		if checkResult == 1
			if HUD.flyoff < screen.xsize
				HUD.flyoff -= 15
			end if
		else
			if HUD.hidden == 0
				if HUD.flyoff < 0
					HUD.flyoff += 15
				endif
		//	else
		//		if HUD.flyoff < screen.xsize
		//			HUD.flyoff -= 10
		//		endif
			endif
		end if
	end if
	temp0 = HUD.flyoff
	
	temp0 += 5
	
	temp0 -= 3
	DrawSpriteScreenXY(55, 10, temp0)
	temp3 = screen.xsize
	temp3 -= 88
	DrawSpriteScreenXY(51, temp3, temp0)
	
	temp0 += 3
	temp3 += 3

	if player[0].rings == 0
		if HUD.flashingTimer > 7
			DrawSpriteScreenXY(12, temp3, temp0)
		end if
	end if

	temp0 += 8

	DrawNumbers(24, 24, temp0, stage.minutes, 2, 7, 1)
	DrawNumbers(24, 42, temp0, stage.seconds, 2, 7, 1)
	DrawNumbers(24, 60, temp0, stage.milliseconds, 2, 7, 1)

	DrawNumbers(24, 390, temp0, player[0].rings, 3, 7, 1)

	if testmode == 1
		// Player position display, show it if they have debug mode on

		// XPos display
		temp0 = player[0].xpos
		temp0 >>= 16
		Abs(temp0)
		temp1 = screen.xsize
		temp1 -= 24
		DrawNumbers(24, temp1, 113, temp0, 5, 7, 1)

		// YPos display
		temp0 = player[0].ypos
		temp0 >>= 16
		Abs(temp0)
		DrawNumbers(24, temp1, 129, temp0, 5, 7, 1)
		DrawNumbers(24, temp1, 145, object[47].value2, 3, 7, 1)
		DrawNumbers(24, temp1, 161, boss.health, 3, 7, 1)

		temp1 -= 64

		DrawNumbers(24, temp1, 113, tileLayer[0].xsize, 3, 7, 1)			//Stage Size X
		DrawNumbers(24, temp1, 129, tileLayer[0].ysize, 3, 7, 1)			//Stage Size Y
		DrawNumbers(24, temp1, 145, tileLayer[1].parallaxFactor, 8, 7, 1) 	//will remove this later
		DrawNumbers(24, temp1, 161, hParallax[0].scrollPos, 8, 7, 1) 	//will remove this later
	end if

	if stage.debugMode == true
		DrawSpriteScreenXY(53, 0, screen.ysize)
		// XPos display
		temp0 = player[0].xpos
		temp0 >>= 16
		Abs(temp0)
		temp1 = screen.xsize
		temp1 -= 24
		DrawNumbers(24, temp1, 113, temp0, 5, 7, 1)

		// YPos display
		temp0 = player[0].ypos
		temp0 >>= 16
		Abs(temp0)
		DrawNumbers(24, temp1, 129, temp0, 5, 7, 1)
	end if

	temp0 = 100
	temp4 = 0

	temp1 = HUD.flyoff
	temp1 += 18

	if HUD.flyoff == 0
		if bosshealthrise.complete == 0
			//hud.timer++
			//if hud.timer >= 1
				if boss.health <= boss.health.max
					boss.health += 1
					hud.timer = 0
				else
					boss.health = boss.health.max
					bosshealthrise.complete = 1
				end if
			//end if
		end if
		DrawRect(100, 6, 230, temp1, 255,255,255, 255)
	else
		temp4 = 0
	end if
	foreach (TypeName[Pause Menu], arrayPos0, ALL_ENTITIES)
		if object[arrayPos0].state == 1
			object.value6 = 0
		else
			object.value6 = 255
		end if
	next
	temp5 = 255
	DrawRect(temp0, 6, boss.health, temp1, object.value6,0,0, 255)

	temp0 = HUD.flyoff
	temp0 += 3
	DrawSpriteScreenXY(59, screen.xcenter, temp0)


	if boss.health > boss.health.max
		boss.health -= 1
	end if

	//if inputpress.buttonX == 1
	//	boss.health.max -= 30
	//end if
end function



function HUD_DrawMobile
end function


event ObjectDraw

	if player.rings[0] == 0
		HUD.flashingTimer++

		if HUD.flashingTimer == 16
			HUD.flashingTimer = 0
		end if
	else
		if stage.minutes == 9
			HUD.flashingTimer++

			if HUD.flashingTimer == 16
				HUD.flashingTimer = 0
			end if
		end if
	end if

	CallFunction(HUD.drawFunction)

end event

event ObjectStartup
	ReadSaveRAM()

	LoadSpriteSheet("Global/HUD.gif")

	// HUD frames
	SpriteFrame(1, 0, 11, 16, 110, 2) 	// 0  - Number 0
	SpriteFrame(0, 0, 11, 16, 122, 2) 	// 1  - Number 1
	SpriteFrame(0, 0, 11, 16, 134, 2)	// 2  - Number 2
	SpriteFrame(0, 0, 11, 16, 146, 2) 	// 3  - Number 3
	SpriteFrame(0, 0, 11, 16, 158, 2)	// 4  - Number 4
	SpriteFrame(0, 0, 11, 16, 170, 2) 	// 5  - Number 5
	SpriteFrame(0, 0, 11, 16, 182, 2) 	// 6  - Number 6
	SpriteFrame(0, 0, 11, 16, 194, 2) 	// 7  - Number 7
	SpriteFrame(0, 0, 11, 16, 206, 2)	// 8  - Number 8
	SpriteFrame(0, 0, 11, 16, 218, 2) 	// 9  - Number 9
										// (A-F characters next to those are unused)
	SpriteFrame(0, 0, 108, 72, 1, 1) 	// 10 - Main
	SpriteFrame(0, 0, 31, 11, 1, 119) 	// 11 - Unused
	SpriteFrame(0, 0, 22, 23, 110,28) 	// 12 - No Rings
	SpriteFrame(0, 0, 65, 29, 44, 74) 	// 13 - Ring Count
	SpriteFrame(0, -1, 65, 28, 44, 104) 	// 14 - Score Count
	SpriteFrame(0, 0, 17, 16, 83, 18) 	// 15 - Sonic life icon
	SpriteFrame(0, 0, 16, 16, 100, 18) 	// 16 - Tails life icon
	SpriteFrame(0, 0, 16, 16, 117, 18) 	// 17 - Knuckles life icon
	SpriteFrame(0, 0, 8, 8, 1, 98) 		// 18 - Debug "X"
	SpriteFrame(0, 0, 8, 8, 10, 98) 	// 19 - Debug "Y"
	SpriteFrame(0, 0, 6, 6, 19, 98) 	// 20 - Debug small *
	SpriteFrame(0, 0, 31, 7, 185, 18) 	// 21 - "Sonic" life icon text

	// Tails or Miles
	SpriteFrame(0, 0, 31, 7, 217, 18)  	// 22 - "Tails" life icon text

	SpriteFrame(0, 0, 31, 7, 217, 26) 	// 23 - "K-T-E" life icon text
	SpriteFrame(0, 0, 6, 8, 110, 19) 	// 24 - Life icon number 0
	SpriteFrame(0, 0, 6, 8, 117, 19)  	// 25 - Life icon number 1
	SpriteFrame(0, 0, 6, 8, 124, 19)  	// 26 - Life icon number 2
	SpriteFrame(0, 0, 6, 8, 131, 19)  	// 27 - Life icon number 3
	SpriteFrame(0, 0, 6, 8, 138, 19)  	// 28 - Life icon number 4
	SpriteFrame(0, 0, 6, 8, 145, 19)  	// 29 - Life icon number 5
	SpriteFrame(0, 0, 6, 8, 152, 19)  	// 30 - Life icon number 6
	SpriteFrame(0, 0, 6, 8, 159, 19)  	// 31 - Life icon number 7
	SpriteFrame(0, 0, 6, 8, 166, 19)  	// 32 - Life icon number 8
	SpriteFrame(0, 0, 6, 8, 173, 19)  	// 33 - Life icon number 9
	SpriteFrame(-16, 0, 8, 8, 127, 64) 	// 34 - Debug minus icon
	SpriteFrame(8, 0, 8, 8, 136, 64) 	// 35 - Debug plus icon
	SpriteFrame(0, 0, 8, 8, 25, 98) 	// 36 - Debug red "X"
	SpriteFrame(0, 0, 8, 8, 34, 98) 	// 37 - Debug red "Y"

	SpriteFrame(0, 0, 6, 8, 110, 52) 	// 38 - Life icon number 0
	SpriteFrame(0, 0, 6, 8, 117, 52)  	// 39 - Life icon number 1
	SpriteFrame(0, 0, 6, 8, 124, 52)  	// 40 - Life icon number 2
	SpriteFrame(0, 0, 6, 8, 131, 52)  	// 41 - Life icon number 3
	SpriteFrame(0, 0, 6, 8, 138, 52)  	// 42 - Life icon number 4
	SpriteFrame(0, 0, 6, 8, 145, 52)  	// 43 - Life icon number 5
	SpriteFrame(0, 0, 6, 8, 152, 52)  	// 44 - Life icon number 6
	SpriteFrame(0, 0, 6, 8, 159, 52)  	// 45 - Life icon number 7
	SpriteFrame(0, 0, 6, 8, 166, 52)  	// 46 - Life icon number 8
	SpriteFrame(0, 0, 6, 8, 173, 52)  	// 47 - Life icon number 9
	SpriteFrame(0, 0, 3, 8, 180, 52)  	// 48 - Life icon number "

	SpriteFrame(-40, 0, 79, 22, 112, 63) 	// 49 - TA Main
	SpriteFrame(0, 0, 83, 29, 192, 63) 	// 50 - TA Score
	SpriteFrame(0, 0, 83, 29, 192, 93) 	// 51 - TA Ring Count

	SpriteFrame(0, 0, 6, 8, 180, 19)  	// 52 - Life icon number 0 GREY

	SpriteFrame(1, -10, 85, 10, 1, 135) 	// 53 - hi cheater
	SpriteFrame(1, -10, 154, 44, 1, 467) 	// 54 - test build message

	SpriteFrame(0, 0, 83, 29, 276, 63) 	// 55 - Boss Time

	SpriteFrame(0, 0, 16, 16, 150, 28) 	// 56 - Red Ring
	SpriteFrame(0, 0, 16, 16, 133, 28) 	// 57 - Red Ring

	SpriteFrame(0, 0, 83, 29, 192, 33) 	// 58 - TA Score

	SpriteFrame(-122, 0, 247, 27, 156, 467) 	// 59 - Boss Health

	// Set the HUD's draw function based on the current platform
	foreach (TypeName[HUD], arrayPos0, ALL_ENTITIES)
		switch options.gamemode
		case 1
			HUD[arrayPos0].drawFunction = HUD_DrawTA
			break		
		default
			HUD[arrayPos0].flyoff = -300
			if stage.actNum == 3
				HUD[arrayPos0].drawFunction = HUD_DrawPCBoss
			else
				HUD[arrayPos0].drawFunction = HUD_DrawPC
			end if
			break
		end switch
	next

end event

event RSDKDraw
	DrawSprite(0)
end event

event RSDKLoad
	LoadSpriteSheet("Global/Display.gif")
	SpriteFrame(-16, -16, 32, 32, 1, 143)
end event
